import Food from "./Food";
import Snake from "./snake";
import ScorePanel from "./ScorePanel";


// 游戏控制器类
class GameControl{
  // 定义三个属性
  food:Food
  snake:Snake
  scorePanel:ScorePanel

  // 创建一个属性来存储蛇的移动方向（也就是按键的方向）
  direction:string='Right'

  // 创建一个属性用来记录游戏是否结束
  isLive = true

  constructor(){
    this.food = new Food()
    this.snake = new Snake()
    this.scorePanel = new ScorePanel()

    this.init()
  }

  // 游戏的初始化方法，调用后游戏即开始
  init(){
    // 绑定键盘键按下的事件
    document.addEventListener('keydown',this.keydownHandler.bind(this))
    // 调用方法使蛇移动
    this.run()
  }

  // 创建一个键盘按下的响应函数
  keydownHandler(event:KeyboardEvent){
    this.direction = event.key
  }

  run(){
    // 获取蛇现在的坐标
    let X = this.snake.X
    let Y = this.snake.Y

    // 根据按键方向修改X和Y的值
    switch (this.direction) {
      case "ArrowUp":
      case "Up":
        // 向上移动
        Y-=10
        break
      case "ArrowDown":
      case "Down":
        // 向下移动
        Y+=10
        break
      case "ArrowLeft":
      case "Left":
        // 向左移动
        X-=10
        break
      case "ArrowRight":
      case "Right":
        // 向右移动
        X+=10
        break
    }

    // 检查是否吃到了食物
    this.checkEat(X,Y)
    

    // 修改蛇的X和Y值
    try {
      this.snake.X=X
      this.snake.Y=Y
    } catch (error) {
      // 进入到catch，说明出现了异常，游戏结束，弹出一个提示消息
      alert(error)
      // 同时将 islive 设置为 false
      this.isLive = false
    }
    
    // 开启一个定时器
    this.isLive&&setTimeout(this.run.bind(this),300 - (this.scorePanel.level-1)*30)
  }

  // 定义一个方法，用来检查蛇是否吃到食物
  checkEat(X:number,Y:number){
    if(X===this.food.X && Y===this.food.Y){
      // 食物的位置要进行重置
      this.food.change()
      // 分数增加
      this.scorePanel.addScore()
      // 蛇要增加一节
      this.snake.addBodies()
    }
  }

}

export default GameControl